const dbHelper = require('../dbhelper/iptable')
const tool = require('../util/tool');
const ApiError = require('../error/api_error');
const ApiErrorNames = require('../error/api_error_name');
const Model = require('../models/iptable')

/**
 * 查
 */
exports.find = async (ctx) => {
  let result;
  const reqQuery = ctx.query;
  //get查询中的带query
  if (reqQuery && !tool.isEmptyObject(reqQuery)) {
    if (reqQuery.id) {
      result = dbHelper.finById(reqQuery.id);
    } else {
      //console.log('检查到是get?没有Id')
      result = dbHelper.findSome(reqQuery)
    }
  } else {
    result = dbHelper.findAll();//不带就返回所有
  }

  await result.then((res) => {
    if (res) {
      ctx.body = res;
    } else {
      throw new ApiError(ApiErrorNames.UNEXIST_ID);
    }
  }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });

};

//restfull风格查动态路由id
exports.detail = async (ctx) => {
  const {id, ips_id} = ctx.params;

  if (!tool.validatorsFun.numberAndCharacter(id)) {
    throw new ApiError(ApiErrorNames.LEGAL_ID);
  }
  //如果只有id
  if (id && !ips_id) {
    await dbHelper.finById(id).then((res) => {
      if (res) {
        ctx.body = res;
      } else {
        throw new ApiError(ApiErrorNames.UNEXIST_ID);
      }
    }).catch((err) => {
      if (err.name === 'CastError') {
        throw new ApiError(ApiErrorNames.UNEXIST_ID);
      } else {
        throw new ApiError(err.name, err.message);
      }

    });
  }
  //如果带了ipsid
  if (id && ips_id) {
    await Model.findOne({'_id': id, }).exec().then(
      (res) => {
        let ip={}
        if (res.ips) {
          for (let index in res.ips){
            if (res.ips[index]['_id']==ips_id) ip = res.ips[index]
          }
          if (tool.isEmptyObject(ip)) throw new ApiError(ApiErrorNames.UNEXIST_ID);
          ctx.body = ip;
        } else {
          throw new ApiError(ApiErrorNames.UNEXIST_ID);
        }
      }
    ).catch((err) => {
      if (err.name === 'CastError') {
        throw new ApiError(ApiErrorNames.UNEXIST_ID);
      } else {
        throw new ApiError(err.name, err.message);
      }

    });
  }
};

exports.add = async (ctx) => {
  const dataObj = ctx.request.body;
  await dbHelper.add(dataObj).then((res) => {
    ctx.body = res;
  }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });
};

/**
 * 更新
 */
exports.update = async (ctx) => {
  const ctxParams = ctx.params;
  // 合并 路由中的参数 以及 发送过来的参数
  // 路由参数 以及发送的参数可能都有 id 以 发送的 id 为准，如果没有，取路由中的 id
  const dataObj = {...ctxParams, ...ctx.request.body};

  await dbHelper.update(dataObj).then((res) => {
    if (res) {
      ctx.body = res;
    } else {
      throw new ApiError(ApiErrorNames.UNEXIST_ID);
    }
  }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });
};
exports.updateIps = async (ctx) => {
  const {id,ips_id} = ctx.params;
  // 合并 路由中的参数 以及 发送过来的参数
  // 路由参数 以及发送的参数可能都有 id 以 发送的 id 为准，如果没有，取路由中的 id
  // const dataObj = {...ctxParams, ...ctx.request.body};
  await Model.findOneAndUpdate({_id: id,'ips._id':ips_id}, { $set:{'ips.$[ip]':ctx.request.body},}, { arrayFilters:[{'ip._id':ips_id}],new: true, // 返回修改后的数据
    }).exec().then((res) => {
    if (res) {
      ctx.body = res;
    } else {
      throw new ApiError(ApiErrorNames.UNEXIST_ID);
    }
  }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });
};


exports.updateSnmp = async (ctx) =>{
  const {id} = ctx.params;
  await Model.findOneAndUpdate({_id:id},{$set:{'snmpinfo':ctx.request.body}},{new:true}).exec()
    .then(res =>{
      if (res) {
      ctx.body = res;
    } else {
      throw new ApiError(ApiErrorNames.UNEXIST_ID);
    }
    }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });
};

/**
 * 删除
 */
exports.delete = async (ctx) => {
  const ctxParams = ctx.params;
  // 合并 路由中的参数 以及 发送过来的参数
  // 路由参数 以及发送的参数可能都有 id 以 发送的 id 为准，如果没有，取路由中的 id
  const dataObj = {...ctxParams, ...ctx.request.body};
  if (!tool.validatorsFun.numberAndCharacter(dataObj.id)) {
    throw new ApiError(ApiErrorNames.LEGAL_ID);
  }

  await dbHelper.delete(dataObj.id).then((res) => {
    if (res) {
      ctx.body = res;
    } else {
      throw new ApiError(ApiErrorNames.UNEXIST_ID);
    }
  }).catch((err) => {
    throw new ApiError(err.name, err.message);
  });
};



